Unrealize ATContext on unroot
authorEmmanuele Bassi <ebassi@gnome.org>
Mon, 8 Nov 2021 10:14:48 +0000 (10:14 +0000)
committerEmmanuele Bassi <ebassi@gnome.org>
Mon, 8 Nov 2021 10:18:22 +0000 (10:18 +0000)
Non-root widgets should unrealize their ATContext, if they have one,
when they are unrooted, as they don't have a connection to a top level
any more.

Fixes: #4421
gtk/gtkwidget.c

index 907e2004f2038c54a94b5d9edc1a43a8c98839d1..b0921818a8e5af992b082d520cc59f140fc2b496 100644 (file)
@@ -2441,6 +2441,18 @@ gtk_widget_root_at_context (GtkWidget *self)
   gtk_at_context_set_display (priv->at_context, gtk_root_get_display (priv->root));
 }
 
+static void
+gtk_widget_unroot_at_context (GtkWidget *self)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (self);
+
+  if (priv->at_context != NULL)
+    {
+      gtk_at_context_set_display (priv->at_context, gdk_display_get_default ());
+      gtk_at_context_unrealize (priv->at_context);
+    }
+}
+
 void
 gtk_widget_realize_at_context (GtkWidget *self)
 {
@@ -2532,6 +2544,9 @@ gtk_widget_unroot (GtkWidget *widget)
 
   if (!GTK_IS_ROOT (widget))
     {
+      /* Roots unrealize the ATContext on unmap */
+      gtk_widget_unroot_at_context (widget);
+
       priv->root = NULL;
       g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_ROOT]);
     }